Jon McClinton and Robert Lipe add NMEA realtime tracking output, tweak realtime track...
authorrobertl <robertl>
Thu, 15 Mar 2007 16:53:44 +0000 (16:53 +0000)
committerrobertl <robertl>
Thu, 15 Mar 2007 16:53:44 +0000 (16:53 +0000)
defs.h
globals.c
kml.c
main.c
nmea.c

diff --git a/defs.h b/defs.h
index 3ed825b43c068059dc9189d367c8e770e06a25e8..28609b2b45b2bf66cc5e981fe9c53324a125d112 100644 (file)
--- a/defs.h
+++ b/defs.h
@@ -425,10 +425,10 @@ typedef struct {
 } bounds;
 
 typedef struct {
-       int request_terminate;
+       volatile int request_terminate;
 } posn_status;
 
-
+extern posn_status tracking_status;
 
 typedef void (*ff_init) (char const *);
 typedef void (*ff_deinit) (void);
index f51201caa502ed48139d6acbde4b374380e2df30..3891a45e7d2f630a61db0f7b320806ff1b9f10ef 100644 (file)
--- a/globals.c
+++ b/globals.c
@@ -28,3 +28,4 @@ const char gpsbabel_version[] = VERSION;
 time_t gpsbabel_now;   /* gpsbabel startup-time; initialized in main.c with time() */
 time_t gpsbabel_time;  /* gpsbabel startup-time; initialized in main.c with current_time(), ! ZERO within testo ! */
 
+posn_status tracking_status;
diff --git a/kml.c b/kml.c
index c544a041f6e0f814ae8da556d3ebdf801c8d4710..6ecc92bfdf9c4e7c1cf99abddf79fe5479c25915 100644 (file)
--- a/kml.c
+++ b/kml.c
@@ -280,7 +280,6 @@ kml_wr_position_init(const char *fname)
         * matters in this mode, turn the pretty formatting off.
         */
        do_indentation = 0;
-       kml_wr_init(posnfilenametmp);
 
        max_position_points = atoi(opt_max_position_points);
 }
@@ -296,10 +295,18 @@ kml_wr_deinit(void)
                MOVEFILE_REPLACE_EXISTING);
 #endif
                rename(posnfilenametmp, posnfilename);
+       }
+       ofd = NULL;
+}
+
+static void
+kml_wr_position_deinit(void)
+{
+       kml_wr_deinit();
+       if (posnfilenametmp) {
                xfree(posnfilenametmp);
                posnfilenametmp = NULL;
        }
-       ofd = NULL;
 }
 
 /*
@@ -894,6 +901,8 @@ kml_wr_position(waypoint *wpt)
 {
        static time_t last_valid_fix;
 
+       kml_wr_init(posnfilenametmp);
+
        if (!posn_trk_head) {
                posn_trk_head = route_head_alloc();
                track_add_head(posn_trk_head);
@@ -940,6 +949,8 @@ kml_wr_position(waypoint *wpt)
                waypoint *tonuke = (waypoint *) QUEUE_FIRST(&posn_trk_head->waypoint_list);
                track_del_wpt(posn_trk_head, tonuke);
        }
+
+//     kml_wr_deinit();
 }
 
 ff_vecs_t kml_vecs = {
@@ -954,5 +965,5 @@ ff_vecs_t kml_vecs = {
        NULL, 
        kml_args,
        CET_CHARSET_UTF8, 1,    /* CET-REVIEW */
-       { NULL, NULL, NULL, kml_wr_position_init, kml_wr_position, kml_wr_deinit }
+       { NULL, NULL, NULL, kml_wr_position_init, kml_wr_position, kml_wr_position_deinit }
 };
diff --git a/main.c b/main.c
index 6c1aabfb39efd741f8ea4948439126dd17208e9c..dd8161d479b93f5e2934d5361ea5d843e3a81a2b 100644 (file)
--- a/main.c
+++ b/main.c
 #include "csv_util.h"
 #include "inifile.h"
 #include <ctype.h>
+#include <signal.h>
 
 #define MYNAME "main"
 
+void signal_handler(int sig);
+
 typedef struct arg_stack_s {
        int argn;
        int argc;
@@ -142,6 +145,7 @@ usage(const char *pname, int shorter )
 "    -s               Synthesize shortnames\n"
 "    -r               Process route information\n"
 "    -t               Process track information\n"
+"    -T               Process realtime tracking information\n"
 "    -w               Process waypoint information [default]\n"
 "    -b               Process command file (batch mode)\n"
 "    -c               Character set for next operation\n"
@@ -345,7 +349,7 @@ main(int argc, char *argv[])
                                ivecs->rd_init(fname);
                                ivecs->read();
                                ivecs->rd_deinit();
-                               
+
                                cet_convert_strings(global_opts.charset, NULL, NULL);
                                cet_convert_deinit();
                                
@@ -618,21 +622,27 @@ main(int argc, char *argv[])
                }
 
                if (ovecs) {
-                       if (!ovecs->position_ops.wr_init || 
-                           !ovecs->position_ops.wr_position ||
-                           !ovecs->position_ops.wr_deinit) {
-                               fatal ("This output format does not support realtime positioning.\n");
+                       if ( !ovecs->position_ops.wr_position  ) {
+                               fatal ("This output format does not support output of realtime positioning.\n");
                        }
                }
 
-               while (1) {
-                       posn_status status;
+               if (signal(SIGINT, signal_handler) == SIG_ERR) {
+                       fatal ("Couldn't install the exit signal handler.\n");
+               }
+
+               if (ovecs->position_ops.wr_init) {
+                       ovecs->position_ops.wr_init(ofname);
+               }
+
+               tracking_status.request_terminate = 0;
+               while (!tracking_status.request_terminate) {
                        waypoint *wpt;
 
-                       status.request_terminate = 0;
-                       wpt = ivecs->position_ops.rd_position(&status);
+                       tracking_status.request_terminate = 0;
+                       wpt = ivecs->position_ops.rd_position(&tracking_status);
 
-                       if (status.request_terminate) {
+                       if (tracking_status.request_terminate) {
                                if (wpt) {
                                        waypt_free(wpt);
                                }
@@ -640,9 +650,9 @@ main(int argc, char *argv[])
                        }
                        if (wpt) {
                                if (ovecs) {
-                                       ovecs->position_ops.wr_init(ofname);
+//                                     ovecs->position_ops.wr_init(ofname);
                                        ovecs->position_ops.wr_position(wpt);
-                                       ovecs->position_ops.wr_deinit();
+//                                     ovecs->position_ops.wr_deinit();
                                } else {
                                        /* Just print to screen */
                                        waypt_disp(wpt);
@@ -674,3 +684,9 @@ main(int argc, char *argv[])
 #endif
        exit(0);
 }
+
+void signal_handler(int sig)
+{
+       tracking_status.request_terminate = 1;
+}
+
diff --git a/nmea.c b/nmea.c
index fcc78e486cd201ec08656490a17bb31612ad7167..ac6181c795ef81bd42c44ba3a0f51a3c96b23c56 100644 (file)
--- a/nmea.c
+++ b/nmea.c
@@ -174,8 +174,10 @@ static char *optdate = NULL;
 static char *getposnarg = NULL;
 static char *opt_sleep = NULL;
 static char *opt_baud = NULL;
+static char *opt_append = NULL;
 static long sleepus = 0;
 static int getposn;
+static int append_output;
 
 static time_t last_time = -1;
 static double last_read_time;   /* Last timestamp of GGA or PRMC */
@@ -193,6 +195,7 @@ arglist_t nmea_args[] = {
        { "get_posn", &getposnarg, "Return current position as a waypoint", 
                NULL, ARGTYPE_BOOL, ARG_NOMINMAX},
        {"pause", &opt_sleep, "Decimal seconds to pause between groups of strings", NULL, ARGTYPE_INT, ARG_NOMINMAX },
+       {"append_positioning", &opt_append, "Append realtime positioning data to the output file instead of truncating", "0", ARGTYPE_BOOL, ARG_NOMINMAX },
        {"baud", &opt_baud, "Speed in bits per second of serial port (baud=4800)", NULL, ARGTYPE_INT, ARG_NOMINMAX },
        ARG_TERMINATOR
 };
@@ -266,7 +269,9 @@ nmea_rd_deinit(void)
 static void
 nmea_wr_init(const char *portname)
 {
-       file_out = gbfopen(portname, "w+", MYNAME);
+       append_output = atoi(opt_append);
+
+       file_out = gbfopen(portname, append_output ? "a+" : "w+", MYNAME);
 
        if ( opt_sleep ) {
                if ( *opt_sleep ) {
@@ -276,7 +281,7 @@ nmea_wr_init(const char *portname)
                        sleepus = -1;
                }
        }
-       
+
        mkshort_handle = mkshort_new_handle();
        setshort_length(mkshort_handle, atoi(snlenopt));
 }
@@ -1201,6 +1206,25 @@ nmea_write(void)
        track_disp_all(nmea_track_init, NULL, nmea_trackpt_pr);
 }
 
+static void
+nmea_wr_posn_init(const char *fname)
+{
+       nmea_wr_init(fname);
+}
+
+static void
+nmea_wr_posn(waypoint *wpt)
+{
+       nmea_trackpt_pr(wpt);
+}
+
+static void
+nmea_wr_posn_deinit(void)
+{
+//     nmea_wr_deinit();
+}
+
+
 ff_vecs_t nmea_vecs = {
        ff_type_file,
        { ff_cap_read | ff_cap_write, ff_cap_read | ff_cap_write, ff_cap_none},
@@ -1213,7 +1237,8 @@ ff_vecs_t nmea_vecs = {
        NULL,
        nmea_args,
        CET_CHARSET_ASCII, 0,   /* CET-REVIEW */
-       { nmea_rd_posn_init, nmea_rd_posn, nmea_rd_deinit, NULL, NULL, NULL }
+       { nmea_rd_posn_init, nmea_rd_posn, nmea_rd_deinit, 
+         nmea_wr_posn_init, nmea_wr_posn, nmea_wr_posn_deinit }
 };
 
 /*